package com.rc.saas.mini.service.invoice.service;

import com.rc.saas.mini.model.invoice.Invoice;
import com.rc.saas.mini.model.member.MemberInfo;
import com.rc.saas.mini.model.tenant.TenantInvoiceInfo;
import com.rc.saas.mini.service.invoice.pojo2.*;
import com.rc.saas.mini.vo.invoice.ElecInvoiceVo;
import com.rc.saas.mini.vo.invoice.InvoiceApplyVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;

/**
 * @author wangzhengwei
 * @create 2021/4/28
 */
@Service
public class InvoiceWebServiceImpl implements InvoiceWebService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public ReturnElectronice createInvEli(InvoiceApplyVo invoiceVo, ElecInvoiceVo elecInvoiceVo, TenantInvoiceInfo tenantInvoiceInfo, MemberInfo memberInfo) {
        IEliWebService2 wb = new IEliWebService2();
        // 对象工厂
        ObjectFactory of = new ObjectFactory();
        /******** 发票总体类 ********/
        ElectroniceInfo e = new ElectroniceInfo();
        e.setUserName(of.createElectroniceInfoUserName("14410101"));
        e.setPassWord(of.createElectroniceInfoPassWord("JWVFkqs7IP+++xBb1I9a/qr6/L/qYxyw=="));
        // 发票请求唯一流水号
        String fplsh = "1" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                + UUID.randomUUID().toString().substring(12);//订单号:时间戳到毫秒+uuid后12位
        e.setFPQQLSH(of.createElectroniceInfoFPQQLSH(fplsh)); //自己生成
        // 业务订单号
        String orderNum = "1" + new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
                + UUID.randomUUID().toString().substring(24);//订单号:时间戳到毫秒+uuid后12位

        e.setDDH(of.createElectroniceInfoDDH(orderNum)); //
        // 开票方纳税人识别号
        //e.setKPNSRSBH(of.createElectroniceInfoKPNSRSBH("91440115353529313K")); //从invoice对象里面拿
        e.setKPNSRSBH(of.createElectroniceInfoKPNSRSBH(tenantInvoiceInfo.getSellerCode())); //从invoice对象里面拿
        //购货方纳税人识别号
        e.setGHFNSRSBH(of.createElectroniceInfoGHFNSRSBH(invoiceVo.getCompanyCredit()));
        // 开票方名称
        e.setKPNSRMC(of.createElectroniceInfoKPNSRMC(invoiceVo.getAddressee())); // 从invoice对象里面拿
        // 代开标志
        e.setDKBZ(of.createElectroniceInfoDKBZ("0")); //不代开
        // 销货方识别号
        //440002999999441 测试
        //91440115353529313K 正式
        e.setXHFNSRSBH(of.createElectroniceInfoXHFNSRSBH(tenantInvoiceInfo.getSellerCode())); // 瑞晨的
        // 销货方名称
        e.setXHFMC(of.createElectroniceInfoXHFMC(tenantInvoiceInfo.getSellerName())); // 瑞晨名称
        // 销货方地址
        e.setXHFDZ(of.createElectroniceInfoXHFDZ(tenantInvoiceInfo.getSellerAddress())); //瑞晨地址
        // 销货方电话
        e.setXHFDH(of.createElectroniceInfoXHFDH(tenantInvoiceInfo.getSellerTel())); //瑞晨电话
        // 销货方银行账号
        //e.setXHFYHZH(of.createElectroniceInfoXHFYHZH("中国建设银行广州广花三路支行  4400 1491 1030 5300 6155")); // 瑞晨
        e.setXHFYHZH(of.createElectroniceInfoXHFYHZH(tenantInvoiceInfo.getSellerBank())); // 瑞晨
        // 购货方名称
        e.setGHFMC(of.createElectroniceInfoGHFMC(invoiceVo.getInvoiceTitle())); //从invoice对象里面拿

        //收款人
        //e.setSKR(of.createElectroniceInfoSKR("黄洁娜"));
        e.setSKR(of.createElectroniceInfoSKR(tenantInvoiceInfo.getPayee()));

        //复核人
        //e.setFHR(of.createElectroniceInfoFHR("刘湘梅"));
        e.setFHR(of.createElectroniceInfoFHR(tenantInvoiceInfo.getReviewer()));

        // 开票员
        //e.setKPR(of.createElectroniceInfoKPR("翁宋珠")); // 财务部的
        e.setKPR(of.createElectroniceInfoKPR(tenantInvoiceInfo.getDrawer())); // 财务部的
        // 开票类型  根据前段传来的信息判断
        e.setKPLX(of.createElectroniceInfoKPLX(invoiceVo.getKPLX())); // 1正票、2红票

        // 操作代码 同上
        e.setCZDM(of.createElectroniceInfoCZDM(invoiceVo.getCZDM()));//10正票正常开具 11正票错票重开 20 退货折让红票、21 错票重开红票、
//		e.setYFPDM(of.createElectroniceInfoYFPDM("044001507111"));
//		e.setYFPHM(of.createElectroniceInfoYFPHM("14514790"));
        // 价税合计金额
        e.setKPHJJE(elecInvoiceVo.getDiscountAmount().add(elecInvoiceVo.getChargeAmount()).add(elecInvoiceVo.getServiceAmount()).doubleValue()); //金额
        //合计税额
        BigDecimal chargeSE = elecInvoiceVo.getChargeAmount().divide(new BigDecimal(1.13), 20, RoundingMode.HALF_EVEN).multiply(new BigDecimal(0.13));
        BigDecimal service = elecInvoiceVo.getServiceAmount().add(elecInvoiceVo.getDiscountAmount());
        BigDecimal serviceSE = service.divide(new BigDecimal(1.06), 20, RoundingMode.HALF_EVEN).multiply(new BigDecimal(0.06));
        e.setHJSE(chargeSE.add(serviceSE).doubleValue()); //税额
        e.setBMBBBH(of.createElectroniceInfoBMBBBH("30.0"));//目前需要传30.0
        // 备注
        //e.setBZ(of.createElectroniceInfoBZ(invoiceVo.getAddresseeTel()));//可不填
        //可不填 申请人手机号码
        e.setBZ(of.createElectroniceInfoBZ(memberInfo.getMobile()));

        // 购货方邮箱地址(开票自动推送邮箱)
//		e.setGHFEMAIL(of.createElectroniceInfoGHFEMAIL("617318403@qq.com"));

        ArrayOfElectroniceDetail list = new ArrayOfElectroniceDetail();
        /******** 发票明细类 ********/
        ArrayList<ElectroniceDetail> ds = (ArrayList<ElectroniceDetail>) list
                .getElectroniceDetail();
        ElectroniceDetail detail = new ElectroniceDetail();
        // 项目名称
        detail.setXMMC(of.createElectroniceDetailXMMC("代收电费")); //待定
        // 项目单位
        detail.setDW(of.createElectroniceDetailDW("千瓦时")); //次
        // 规格型号
        //detail.setGGXH(of.createElectroniceDetailGGXH("xxl")); //无
        // 项目编码
        //detail.setXMBM(of.createElectroniceDetailXMBM("123321")); //可不填
        // 项目数量
        detail.setXMSL(elecInvoiceVo.getTotalPower().doubleValue()); //1
        // 项目单价
        if(elecInvoiceVo.getTotalPower().equals(BigDecimal.ZERO)){
            elecInvoiceVo.setTotalPower(BigDecimal.ONE);
        }
        BigDecimal divide = elecInvoiceVo.getChargeAmount().divide(elecInvoiceVo.getTotalPower(),20,RoundingMode.HALF_EVEN);
        detail.setXMDJ(divide.doubleValue());//单价
        // 含税标志 (是否含税要记得问财务)
        detail.setHSBZ(of.createElectroniceDetailHSBZ("1")); //表示项目单价和项目金额是否含税。0表示都不含税，1表示都含税。目前输入含税价,即标志为1
        // 项目金额
        detail.setXMJE(elecInvoiceVo.getChargeAmount().doubleValue());//小数点后2位，以元为单位精确到分。等于=单价*数量，根据含税标志，确定此金额是否为含税金额。目前为输入含税金额
        // 税率
        detail.setSL(of.createElectroniceDetailSL("0.13")); //税率(不知道从哪里拿 )
        // 项目税额
        detail.setSE(elecInvoiceVo.getChargeAmount().divide(new BigDecimal(1.13),20,RoundingMode.HALF_EVEN).multiply(new BigDecimal(0.13)).doubleValue()); //应该是 xmje * sl  小数点后两位
        //商品编码
        //11001010202 30799
        detail.setSPBM(of.createElectroniceDetailSPBM("11001010202")); //不知道是啥(到时候问厂家)
        //优惠政策标识
        detail.setYHZCBS(of.createElectroniceDetailYHZCBS("0")); //0：不使用，1使用
        ds.add(detail);
        ElectroniceDetail detail1 = new ElectroniceDetail();
        // 项目名称
        detail1.setXMMC(of.createElectroniceDetailXMMC("充电服务费")); //待定
        // 项目单位
        detail1.setDW(of.createElectroniceDetailDW("次")); //次
        // 规格型号
        //detail.setGGXH(of.createElectroniceDetailGGXH("xxl")); //无
        // 项目编码
        //detail.setXMBM(of.createElectroniceDetailXMBM("123321")); //可不填
        // 项目数量
        detail1.setXMSL(1d); //1
        // 项目单价
        //BigDecimal divide = elecInvoiceVo.getServiceAmount().divide(elecInvoiceVo.getTotalPower(), 8);
        detail1.setXMDJ(elecInvoiceVo.getServiceAmount().doubleValue());//单价
        // 含税标志 (是否含税要记得问财务)
        detail1.setHSBZ(of.createElectroniceDetailHSBZ("1")); //表示项目单价和项目金额是否含税。0表示都不含税，1表示都含税。目前输入含税价,即标志为1
        // 项目金额
        detail1.setXMJE(elecInvoiceVo.getServiceAmount().doubleValue());//小数点后2位，以元为单位精确到分。等于=单价*数量，根据含税标志，确定此金额是否为含税金额。目前为输入含税金额
        // 税率
        detail1.setSL(of.createElectroniceDetailSL("0.06")); //税率(不知道从哪里拿 )
        // 项目税额
        detail1.setSE(elecInvoiceVo.getServiceAmount().divide(new BigDecimal(1.06),20,RoundingMode.HALF_EVEN).multiply(new BigDecimal(0.06)).doubleValue()); //应该是 xmje * sl  小数点后两位
        //商品编码
        detail1.setSPBM(of.createElectroniceDetailSPBM("30799")); //不知道是啥(到时候问厂家)
        //优惠政策标识
        detail1.setYHZCBS(of.createElectroniceDetailYHZCBS("0")); //0：不使用，1使用
        ds.add(detail1);
        if(elecInvoiceVo.getDiscountAmount() != null && elecInvoiceVo.getDiscountAmount().doubleValue() != 0){
            ElectroniceDetail detail2 = new ElectroniceDetail();
            // 项目名称
            detail2.setXMMC(of.createElectroniceDetailXMMC("充电服务费")); //待定
            // 项目单位
            //detail2.setDW(of.createElectroniceDetailDW("千瓦时")); //次
            // 规格型号
            //detail.setGGXH(of.createElectroniceDetailGGXH("xxl")); //无
            // 项目编码
            //detail.setXMBM(of.createElectroniceDetailXMBM("123321")); //可不填
            // 项目数量
            //detail2.setXMSL(elecInvoiceVo.getTotalPower().doubleValue()); //1
            // 项目单价
            //BigDecimal divide = elecInvoiceVo.getServiceAmount().divide(elecInvoiceVo.getTotalPower(), 8);
            //detail2.setXMDJ(elecInvoiceVo.getDiscountAmount().doubleValue());//单价
            // 含税标志 (是否含税要记得问财务)
            detail2.setHSBZ(of.createElectroniceDetailHSBZ("1")); //表示项目单价和项目金额是否含税。0表示都不含税，1表示都含税。目前输入含税价,即标志为1
            // 项目金额
            detail2.setXMJE(elecInvoiceVo.getDiscountAmount().doubleValue());//小数点后2位，以元为单位精确到分。等于=单价*数量，根据含税标志，确定此金额是否为含税金额。目前为输入含税金额
            // 税率
            detail2.setSL(of.createElectroniceDetailSL("0.06")); //税率(不知道从哪里拿 )
            // 项目税额
            detail2.setSE(elecInvoiceVo.getDiscountAmount().divide(new BigDecimal(1.06),20,RoundingMode.HALF_EVEN).multiply(new BigDecimal(0.06)).doubleValue()); //应该是 xmje * sl  小数点后两位
            //商品编码
            detail2.setSPBM(of.createElectroniceDetailSPBM("30799")); //不知道是啥(到时候问厂家)
            //优惠政策标识
            detail2.setYHZCBS(of.createElectroniceDetailYHZCBS("0")); //0：不使用，1使用
            ds.add(detail2);
        }


        e.setDetails(of.createElectroniceInfoDetails(list));
        ReturnElectronice result = wb.getIEliWebServiceHttpPort().invEli(e);
        logger.info("测试请求开票(同步)返回pdf：" + result.getPDFURL().getValue());
        logger.info("测试请求开票(同步)返回信息：" + result.getReturnMsg().getValue());

        return result;
    }


    @Override
    public ReturnElectronice queryEliData(Invoice invoice) {
        return null;
    }

    @Override
    public ElectroniceStock queryEliStock() {
        return null;
    }
}
